#include        <stdio.h>  //标准输入输出头文件
#include        <stdlib.h>  //标准库头文件 
#include        <unistd.h>  //unix类系统定义符号常量的头文件
#include        <fcntl.h>   //定义了一组基于C的非缓冲的文件操作函数，可用于文件和设备（及socket等）的I/O操作

#define BUFFERSIZE      4096   //缓冲区大小
#define COPYMODE        0644   // 新文件的访问权限位

void oops(char *, char *);  //错误处理函数

int main(int argc, char *argv[])
{
    int in_fd, out_fd, n_chars;    
    char buf[BUFFERSIZE];   //定义缓冲区
    if (argc != 3)  //当输入参数不足时
    {
        fprintf(stderr, "usage: %s source destination\n", *argv);
        exit(1);
    }

    if ((in_fd = open(argv[1], O_RDONLY)) == -1)      /打开文件失败
        oops("Cannot open ", argv[1]);

    if ((out_fd = creat(argv[2], COPYMODE)) == -1)   //创建新文件失败
        oops("Cannot creat", argv[2]);

    while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)   //缓冲区不空时，开始写文件
        if (write(out_fd, buf, n_chars) != n_chars)  //写文件出错
            oops("Write error to ", argv[2]);
    if (n_chars == -1)   //从文件中读数据出错
        oops("Read error from ", argv[1]);


    if (close(in_fd) == -1 || close(out_fd) == -1)   //关闭输入文件出错或关闭输出文件出错
        oops("Error closing files", "");
}

void oops(char *s1, char *s2)   //错误处理
{
    fprintf(stderr, "Error: %s ", s1);
    perror(s2);
    exit(1);
}